package com.rongkang.interview.juc.volatiletest;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @Description: volatile不保证原子性测试
 * @author: 荣康
 * @date: 2021/11/30
 */
public class VolatileNotAtomicityDemo {
    public static void main(String[] args) {

        MyDate myDate = new MyDate();
        //创建20000个线程来验证他的原子性
        for (int i = 1; i <= 20; i++) {
            new Thread(() -> {
                for (int j = 1; j <= 1000; j++) {
                    myDate.addPlusPlus();
                    myDate.AtomicIntegerPlus();
                }
            }, String.valueOf(i)).start();
        }
        //当正在运行的线程数还在大于2的时候
        while (Thread.activeCount() > 2) {
            //这个方法表示不执行
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName() + " thread over " + myDate.member);
        System.out.println(Thread.currentThread().getName() + " atomicInteger thread over " + myDate.atomicInteger);
    }
}

//解决不保证原子性问题
//1.可以在方法上添加synchronized，但是引入了重量级的同步机制，有种杀鸡焉用牛刀的感觉
//2.使用java.util.concurrent.atomic包中的atomicInteger原子类
class MyDate {
    //加上volatile主要是保证线程和线程之间的可见性， 只要有一个线程修改了主变量的值，其他线程也能马上感知
    volatile int member = 0;
     AtomicInteger atomicInteger = new AtomicInteger();

    public  /*synchronized*/  void addPlusPlus() {
        member++;
    }
    public  void  AtomicIntegerPlus(){
        //相当于member++
        atomicInteger.getAndIncrement();
    }


}
